package jp.co.menox.tmserver.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.appengine.api.datastore.PreparedQuery.TooManyResultsException;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Query;

import jp.co.menox.tmcommon.meta.StatusMeta;
import jp.co.menox.tmcommon.model.Status;

/**
 * ステータスマスタ用dao
 * @author
 *
 */
public class StatusDao extends TmServerDaoBase<Status>{

    /** ステータスタイプ-表示名map */
    protected Map<Integer, String> statusMap = null;
    
    private String nameOfName;

    {
        StatusMeta meta = StatusMeta.get();
        nameOfName = meta.name.getName();
    }


    // **** 固有メソッド
    
    /**
     * ステータスタイプ-表示名をmap形式で取得する
     * @return
     */
    public Map<Integer, String> getStatusMap() {
        if (this.statusMap != null) {
            // すでに取得済み
            return this.statusMap;
        }

        this.statusMap = new HashMap<Integer, String>();
        List<Status> modelList = getAll();
        if (modelList == null) {
            return this.statusMap;
        }
        // mapに詰め替え
        for (Status model: modelList) {
            this.statusMap.put(Integer.valueOf(model.getType()), model.getName());
        }
        
        return this.statusMap;
    }
    

    // **** イベント処理

    /**
     * データ追加時の処理
     * @param key
     */
    @Override
    protected void onInserted(Key key){
        // ステータスタイプ-表示名mapの再取得（予約）
        this.statusMap = null;

        super.onInserted(key);
    }

    /**
     * データ更新時の処理
     * @param key
     */
    @Override
    protected void onUpdated(Key key){
        // ステータスタイプ-表示名mapの再取得（予約）
        this.statusMap = null;

        super.onUpdated(key);
    }

    /**
     * データ論理削除時の処理
     * @param key
     */
    @Override
    protected void onDeleted(Key key){
        // ステータスタイプ-表示名mapの再取得（予約）
        this.statusMap = null;

        super.onDeleted(key);
    }

    /**
     * データ物理削除時の処理
     * @param key
     */
    @Override
    protected void onVanished(Key key){
        // ステータスタイプ-表示名mapの再取得（予約）
        this.statusMap = null;

        super.onVanished(key);
    }


    // **** サンプルメソッド
    
    /**
     * ステータスタイプからステータス名称（表示名）を取得する。<br />
     * 使用は非推奨：マスタなのでmapにした方が便利
     * @param statusType
     * @return 存在しない場合はnull
     */
    @Deprecated
    public String getStatusName(int statusType) {
        Status model = null;
        try {
            model = query()
                    .filter(nameOfName, Query.FilterOperator.EQUAL, statusType)
                    .asSingle();
        } catch(TooManyResultsException e) {
            // TODOF: マスタ不整合（本来は例外処理すべきだが、処理省略）
            return null;
        }
        if (model == null) {
            return null;
        }
        return model.getName();
    }


}
